#include <my_header.h>
// 显示进度条接收数据
/* Usage:  */
int main(void){                                  
    char *ip = "192.168.229.128";
    char *port = "8080";

    int socket_fd = socket(AF_INET, SOCK_STREAM, 0);
    ERROR_CHECK(socket_fd, -1, "socket");

    struct sockaddr_in sockaddr;
    sockaddr.sin_family = AF_INET;
    sockaddr.sin_port = htons(atoi(port));
    sockaddr.sin_addr.s_addr = inet_addr(ip);

    int res_conn = connect(socket_fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
    ERROR_CHECK(res_conn, -1, "connect");
    // 信息在应用层有边界
    // 接收文件名的长度  
    int file_name_len;  
    recv(socket_fd, &file_name_len, sizeof(int), 0); // 接收文件名长度  

    char file_name[60] = {0}; // 文件名缓冲区  
    recv(socket_fd, file_name, file_name_len, 0); // 根据长度接收文件名  

    // 创建文件并打开  
    int file_fd = open(file_name, O_RDWR | O_CREAT, 0600); // 以读写模式创建文件，权限为0600  

    // 接收文件大小
    off_t file_size = 0;
    recv(socket_fd, &file_size, sizeof(off_t), MSG_WAITALL);
    printf("client: file_size: %ld \n", file_size);

  // 数据传输标记:记录接收数据量
   off_t cursize = 0; // 当前接收
   off_t last_update_size = 0; // 每更新一次百分比增加

   while(1)
   {
       char buf[1000] = { 0 };
       ssize_t res = recv(socket_fd, buf, sizeof(buf), MSG_WAITALL);
       if(res ==0)
       {
           printf("file over\n");
           break;
       }
       write(file_fd, buf, res);

       // 记录当前文件的大小
       cursize += res;
       // 记录相比上一次，记录的百分比
       double num = (double)cursize * 100 / file_size - (double)last_update_size * 100 / file_size;
        if(num > 1)
        {
            last_update_size = cursize;
            printf("now : %.2f%% \n", (double)last_update_size * 100 / file_size);
        }
   }
    close(file_fd);
    close(socket_fd);
    return 0;
}

